#ifndef EVENTBUS_H
#define EVENTBUS_H

#include <stdint.h>

/* --------- 事件总线内存定义 --------- */

// 事件节点池
#define MAX_EVENTS 5

// 回调节点池（固定大小）
#define MAX_CALLBACKS 5

// 事件队列（循环队列）
#define EVENT_QUEUE_SIZE 5

/* --------- 事件总线内存定义 --------- */

/**
 * @brief 事件回调函数定义
 * @param pvFixedArgs 固定参数
 * @param pvDynamicArgs 动态参数
 * @return 0: 成功，其他: 失败
 */
typedef void (*EventCallback_TypeDef)(void* pvFixedArgs, void* pvDynamicArgs);

/**
 * @brief 事件总线运行状态定义
 */
typedef enum EventBusState  {
    EVENT_OK = 0,
    EVENT_ERROR,
    EVENT_FULL,
}EventBusState_TypeDef;

/**
 * @brief 事件基类定义
 */
typedef struct EventObject {
    void* pvEvent; // 事件对象
} EventObject_TypeDef;

/**
 * @brief 事件总线初始化
 * @return @see EventBusState_TypeDef
 */
EventBusState_TypeDef
EventBus_Init(void);

/**
 * @brief 创建事件类
 * @param pstEvent 事件对象
 * @return @see EventBusState_TypeDef
 */
EventBusState_TypeDef
EventBus_CreateEvent(EventObject_TypeDef *pstEvent);

/**
 * @brief 连接事件与回调函数以及固定参数
 * @param pstEvent 事件对象
 * @param pfnEventCallback 回调函数
 * @param pvFixedArgs 固定参数
 * @return @see EventBusState_TypeDef
 */
EventBusState_TypeDef
EventBus_Connect(EventObject_TypeDef *pstEvent,
                 EventCallback_TypeDef pfnEventCallback,
                 void* pvFixedArgs);

/**
 * @brief 触发事件
 * @param pstEvent 事件对象
 * @param pvDynamicArgs 动态参数
 * @return @see EventBusState_TypeDef
 */
EventBusState_TypeDef
EventBus_Emit( EventObject_TypeDef *pstEvent,
               void* pvDynamicArgs);

/**
 * @brief 运行事件总线
 * @return @see EventBusState_TypeDef
 */
EventBusState_TypeDef
EventBus_Run(void);

#endif //EVENTBUS_H
